package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.model.chart.MeterGaugeChartModel;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.services.proyeccion.ProyeccionPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.AvancePeriodoBean;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyectadoPeriodoResponse;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;

@ManagedBean
@ViewScoped
public class ProyeccionVentasMBean implements Serializable{
	
	private static final long serialVersionUID = 1L;

	@EJB
	private ProyeccionPeriodoService proyeccionPeriodoService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	
	private MeterGaugeChartModel avanceAnual;
	private MeterGaugeChartModel avancePeriodo;
	private List<PeriodoBean> listaPeriodos;
	private BigDecimal montoAvanceGeneral;
	private BigDecimal montoAvancePeriodo;
	private BigDecimal montoProyeccionGeneral;
	private BigDecimal montoProyeccionPeriodo;
	private String colorBandageneral;
	private String colorBandaPeriodo;
	private Integer periodoDefault;
	
	
	@PostConstruct
    public void init() {
		listarPeriodos();
    	mostrarPeriodoDefault();
        iniciarAvances();
    }
	
	public MeterGaugeChartModel getAvanceAnual() {
		return avanceAnual;
	}
	public void setAvanceAnual(MeterGaugeChartModel avanceAnual) {
		this.avanceAnual = avanceAnual;
	}
	public MeterGaugeChartModel getAvancePeriodo() {
		return avancePeriodo;
	}
	public void setAvancePeriodo(MeterGaugeChartModel avancePeriodo) {
		this.avancePeriodo = avancePeriodo;
	}

	public String getColorBandageneral() {
		return colorBandageneral;
	}

	public void setColorBandageneral(String colorBandageneral) {
		this.colorBandageneral = colorBandageneral;
	}

	public String getColorBandaPeriodo() {
		return colorBandaPeriodo;
	}

	public void setColorBandaPeriodo(String colorBandaPeriodo) {
		this.colorBandaPeriodo = colorBandaPeriodo;
	}

	public BigDecimal getMontoAvanceGeneral() {
		return montoAvanceGeneral;
	}

	public void setMontoAvanceGeneral(BigDecimal montoAvanceGeneral) {
		this.montoAvanceGeneral = montoAvanceGeneral;
	}

	public BigDecimal getMontoAvancePeriodo() {
		return montoAvancePeriodo;
	}

	public void setMontoAvancePeriodo(BigDecimal montoAvancePeriodo) {
		this.montoAvancePeriodo = montoAvancePeriodo;
	}
	
	public Integer getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(Integer periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public BigDecimal getMontoProyeccionGeneral() {
		return montoProyeccionGeneral;
	}

	public void setMontoProyeccionGeneral(BigDecimal montoProyeccionGeneral) {
		this.montoProyeccionGeneral = montoProyeccionGeneral;
	}

	public BigDecimal getMontoProyeccionPeriodo() {
		return montoProyeccionPeriodo;
	}

	public void setMontoProyeccionPeriodo(BigDecimal montoProyeccionPeriodo) {
		this.montoProyeccionPeriodo = montoProyeccionPeriodo;
	}

	public void listarPeriodos(){
		try{
			PeriodoListaBean periodos = mantenimientoPeriodo.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos =periodos.getListaPeriodos();
		}catch(Exception e){
			System.out.println("Error al cargar los periodos: " + e);
		}
	}
	public void mostrarPeriodoDefault(){
		 for(PeriodoBean ls : getListaPeriodos()){
			 	if(ls.getDefecto() !=null && ls.getDefecto()==true){
			 		 setPeriodoDefault(ls.getId());
			 	}
		 }
	}
	
	private MeterGaugeChartModel iniciarBandaGeneral(BigDecimal monto, List<Number> intervalos) {

        return new MeterGaugeChartModel(monto, intervalos);
    }
	
	private MeterGaugeChartModel iniciarBandaPeriodo(BigDecimal monto, List<Number> intervalos) {
		
        return new MeterGaugeChartModel(monto, intervalos);
    }
	
	public void  iniciarAvances(){
		try{
			AvanceProyectadoPeriodoResponse proyecciones = proyeccionPeriodoService.listaAvancePorPeriodo(ObtenerIdTransaccion());
			if(proyecciones.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
				//1.- capturamos los datos para Proyeccion General
				
				StringBuilder colores = new StringBuilder();
				for(String color :proyecciones.getVentaTotal().getColoresBanda() ){
					colores.append(color);
					colores.append(",");
				}
				this.montoAvanceGeneral = proyecciones.getVentaTotal().getTotalAvanceAnual();
				this.montoProyeccionGeneral=proyecciones.getVentaTotal().getTotalVentaAnual();
				
				setColorBandageneral(colores.substring(0, colores.length()-1));
				avanceAnual = iniciarBandaGeneral(proyecciones.getVentaTotal().getTotalAvanceAnual(),proyecciones.getVentaTotal().getListaIntervalos());
				System.out.println("// 2.- capturamos los datos para proyeccion por Periodo.");
				// 2.- capturamos los datos para proyeccion por Periodo.
				for(AvancePeriodoBean periodos : proyecciones.getAvancePorPeriodo().getAvancesPorPeriodo()){
					if(getPeriodoDefault() == periodos.getIdPeriodo()){
						
						this.montoAvancePeriodo = periodos.getTotalVentaAvance();
						this.montoProyeccionPeriodo = periodos.getTotalProyeccion();
						 StringBuilder colorBanda = new StringBuilder();
						for(String color : periodos.getColorBanda()){
							colorBanda.append(color);
							colorBanda.append(",");
						}
						setColorBandaPeriodo(colorBanda.substring(0, colorBanda.length()-1));
						avancePeriodo = iniciarBandaPeriodo(periodos.getTotalVentaAvance(),periodos.getListaBanda());
						break;
					}
				}
			}
			
		}catch(Exception e){
			System.out.println("Error al Obtener la lista de Proyecciones por parametro " + e);
		}
		
	}
	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try{
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		}catch(Exception e){
			sessionId="Error";
			System.out.println("Error al obtener Session" + e);
		}

		return sessionId;
	}
}
